package modelovectorial;

import utn.frc.tsb.utils.ValerioFritelli.SimpleList.SimpleList;

/**
 * @project DLC Final / UTN FRC 2013
 * @date Febrero de 2013
 *
 * @author Gonzalo Arribere
 * @author Gustavo Morales
 * @author Pablo Moreno
 *
 * Esta clase representa un termino limpio o palabra dentro de un documento, es
 * decir un termino que no contiene caracteres raros ni signos de puntuacion.
 */
public class Palabra implements Comparable {

    // Tamaño Minimo de la palabra
    public static final int MIN_WORD_LENGTH = 2;
    // Tamaño Maximo de la palabra
    public static final int MAX_WORD_LENGTH = 21;
    // Cantidad Maxima de Indices guardados en la DB
    public static final int MAX_INDEX = 3000;
    // Cantidad Maxima de Paginas Guardadas en la DB
    public static final int MAX_PAGE = 10;
    public int mIdPalabra;
    // palabra sin los signos de puntuacion.
    private String palabraLimpia;
    // maxima frecuencia de aparicion del termino.
    private int tfMax = 0;
    // frecuencia de aparicion del termino en el documento actual.
    private int tfDoc = 0;
    // cantidad de documentos en los que aparece el termino.
    private int nr = 0;
    // palabra con signos de puntuacion del termino
    private SimpleList ps;

    /**
     * Devuelve el identificador de la palabra dentro de la bd.
     *
     * @return un entero que representa el valor identificador de la palabra
     * dentro de la bd.
     */
    public int getIdPalabra() {
        return mIdPalabra;
    }

    /**
     * Setea el valor identificador de la palabra.
     *
     * @param pIdPalabra entero que representa el valor que identifica la
     * palabra.
     */
    public void setIdPalabra(int pIdPalabra) {
        mIdPalabra = pIdPalabra;
    }

    /**
     * Constructor por defecto
     *
     * @param pIdPalabra
     */
    public Palabra(int pIdPalabra) {
        mIdPalabra = pIdPalabra;
    }

    /**
     * Constructor con parametros de la clase Palabra que inicializa sus
     * atributos.
     *
     * @param pIdPalabra identificador de la palabra.
     * @param pTF Maxima frecuencia del termino.
     * @param pNR Cantidad de documentos en los que la palabra aparece.
     */
    public Palabra(int pIdPalabra, int pTF, int pNR) {
        nr = pNR;
        mIdPalabra = pIdPalabra;
        tfDoc = pTF;
    }

    /**
     * Constructor con paramteros de la clase Palabra que inicializa sus
     * atributos.
     *
     * @param pIdPalabra identificador de la palabra.
     * @param palabraLimpia palabra sin caracteres raros o signos de puntuacion.
     */
    public Palabra(int pIdPalabra, String palabraLimpia) {
        this.palabraLimpia = palabraLimpia;
        mIdPalabra = pIdPalabra;
        ps = new SimpleList();
    }

    /**
     * Constructor con parametros de la clase Palabra que inicializa sus
     * atributos.
     *
     * @param palabraLimpia palabra sin caracteres raros o signos de puntuacion.
     * @param palabraSucia palabra con signos de puntuacion.
     * @param pIndex indice de ubicacion de la palabra dentro del documento.
     */
    public Palabra(String palabraLimpia, String palabraSucia, int pIndex) {
        this.palabraLimpia = palabraLimpia;
        ps = new SimpleList();
        if (pIndex > 0) {
            ps.addFirst(new PalabraSucia(pIndex, palabraSucia));
        }
    }

    /**
     * Agega un nuevo termino con signos de puntuacion asociado a la palabra
     * limpia actual.
     *
     * @param pPalabra palabra con signos de puntuacion.
     * @param pIndex indice de ubicacion de la palabra dentro del documento.
     */
    public void agregarTerminoSucio(String pPalabra, int pIndex) {
        if (pIndex > 0) {
            PalabraSucia palabra = (PalabraSucia) ps.search(new PalabraSucia(pPalabra));
            if (palabra == null) {
                ps.addFirst(new PalabraSucia(pIndex, pPalabra));
            } else {
                palabra.agregarIndice(pIndex);
            }
        }
    }

    /**
     * Devuelve una lista simple que contiene todas las palabras con signos de
     * puntuacion asociadas a la palabra limpia actual.
     *
     * @return una lista simple con objetos que representan las palabras con
     * signos de puntuacion asociadas a la palabra limpia actual.
     */
    public SimpleList getPs() {
        return ps;
    }

    /**
     * Setea la lista de terminos con signos de puntuacion asociadas a la
     * palabra limpia actual.
     *
     * @param ps lista simple con palabras con signos de puntuacion asociadas a
     * la palabra limpia actual.
     */
    public void setPs(SimpleList ps) {
        this.ps = ps;
    }

    /**
     * Devuelve la palabra limpia sin signos de puntuacion.
     *
     * @return cadena con la palabra limpia.
     */
    public String getPalabraLimpia() {
        return palabraLimpia;
    }

    /**
     * Setea la palabra limpia que representa el objeto actual.
     *
     * @param palabraLimpia cadena que contiene la palabra limpia a setear.
     */
    public void setPalabraLimpia(String palabraLimpia) {
        this.palabraLimpia = palabraLimpia;
    }

    /**
     * Devuelve la frecuencia del termino dentro de un documento en proceso.
     *
     * @return un entero que representa la frecuencia del termino en un
     * documento.
     */
    public int getTfDoc() {
        return tfDoc;
    }

    /**
     * Setea la frecuencia del termino dentro de un documento en proceso.
     *
     * @param tfDoc entero que representa la frecuencia del termino en un
     * documento.
     */
    public void setTfDoc(int tfDoc) {
        this.tfDoc = tfDoc;
    }

    /**
     * Incrementa la frecuencia de la palabra dentro de un documento en proceso.
     */
    public void incrementarFrecuencia() {
        tfDoc++;
    }

    /**
     * Devuelve la cantidad de documentos en los que la palabra aparecio.
     *
     * @return un entero que representa la aparicion de la palabra en los
     * documentos.
     */
    public int getNr() {
        return nr;
    }

    /**
     * Setea la cantidad de documentos en los que la palabra aparecio.
     *
     * @param nr entero que representa la cantidad de documentos en los cuales
     * aparecio la palabra.
     */
    public void setNr(int nr) {
        this.nr = nr;
    }

    /**
     * Devuelve la maxima frecuencia de aparicion del termino en los documentos
     * de la base.
     *
     * @return un entero que contiene la frecuencia de aparicion maxima del
     * termino en los documentos.
     */
    public int getTfMax() {
        return tfMax;
    }

    /**
     * Setea la maxima frecuencia de aparicion del termino en los documentos.
     *
     * @param tfMax contiene la maxima frecuencia del termino.
     */
    public void setTfMax(int tfMax) {
        this.tfMax = tfMax;
    }

    /**
     * Redefine el metodo hashCode de Object para la clase Palabra
     *
     * @return
     */
    @Override
    public int hashCode() {
        if (palabraLimpia == null) {
            return mIdPalabra;
        } else {
            return palabraLimpia.hashCode();
        }
    }

    /**
     * Redefine el metodo equals de Object para la clase Palabra.
     *
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Palabra other = (Palabra) obj;
        if ((this.palabraLimpia == null) ? (other.palabraLimpia != null) : !this.palabraLimpia.equals(other.palabraLimpia)) {
            return false;
        }
        return true;
    }

    /**
     * Redefine el metodo compareTo para la clase Palabra.
     *
     * @param o
     * @return
     */
    public int compareTo(Object o) {
        Palabra p = (Palabra) o;

        if (palabraLimpia == null) {
            return mIdPalabra - p.getIdPalabra();
        } else {
            return palabraLimpia.compareTo(p.getPalabraLimpia());
        }
    }

    /**
     * Redefinicion del método toString() de Object para la clase Palabra.
     *
     * @return
     */
    @Override
    public String toString() {
        return "Termino: " + palabraLimpia;
    }
}